Skip to main content

Type de données : REFERENCE TO

Important

Avec la version du compilateur >= V3.3.0.0, les références (avec 0) sont initialisées.

Important

Si une référence pointe vers une entrée d'appareil, l'accès est considéré comme un accès en écriture. Cela conduit à l'avertissement du compilateur lors de la génération de code ...kein gültiges Zuordnungsziel.

Exemple: rInput REF= Input;

Si vous avez besoin d'une construction de ce type, vous avez besoin de la valeur d'entrée, par exemple rInput, première copie dans une variable avec accès en écriture.

Une référence avec le REFERENCE le type de données fait implicitement référence à un autre objet. La mission se fait avec le REF= opérateur. Lors de l'accès, la référence est implicitement déréférencée et ne nécessite donc pas d'opérateur de contenu spécial ^ comme un pointeur.

syntaxe

<identifier> : REFERENCE TO <data type> ;
<data type>: base type of the reference
Exemple 214. Déclaration valide
PROGRAM PLC_PRG
VAR
    rspeA : REFERENCE TO DUT_SPECIAL;
    pspeA : POINTER TO DUT_SPECIAL;
    speB : DUT_SPECIAL;
END_VAR
rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB);
rspeA := speD; // The code corresponds to pspeA^ := speD;


Exemple 215. Déclarations invalides
ariTest : ARRAY[0..9] OF REFERENCE TO INT;
priTest : POINTER TO REFERENCE TO INT;
rriTest : REFERENCE TO REFERENCE TO INT;
rbitTest : REFERENCE TO BIT;


Un type référence ne peut pas être utilisé comme type de base d'un tableau, d'un pointeur ou d'une référence. De plus, une référence ne doit pas faire référence à une variable de bit. De telles constructions génèrent des erreurs de compilation.

Note

La lisibilité d'un programme est rendue difficile lorsqu'on accède simultanément à une même cellule mémoire au moyen d'un identifiant et de son alias.

Exemple: speB et rspeA

Astuce

Références et pointeurs vers BIT les variables sont non valide déclarations, ainsi que des éléments de tableau avec type de base BIT.

Exemple 216. Exemples

Lorsque des références sont attribuées avec :=, une valeur est toujours copiée, que la référence soit à gauche, à droite ou des deux côtés :

  • Ref := value écrit la valeur value à l'endroit où pointe la référence. En notation pointeur : Ref^ := value

  • value := Ref écrit la valeur à laquelle pointe la référence après value. En notation pointeur : value := Ref^

  • Ref1 := Ref2 écrit la valeur qui Ref2 pointe vers. à l'endroit où Ref1 pointe vers. En notation pointeur : Ref1^ := Ref2^

Quand REF= est utilisé, l'adresse est toujours appliquée et il doit y avoir une référence sur le côté gauche :

  • Ref REF= value: La référence pointe vers value. En notation pointeur : Ref :=ADR(value)

  • Ref1 REF= Ref2: Ref1pointe vers la même valeur que Ref2. En notation pointeur :Ref1 := Ref2

  • Value REF = Ref conduit à une erreur de compilation



Astuce

Dans la déclaration, REFERENCE TO INT REF= value se comporte comme REFERENCE TO INT := value.

Comparaison de la référence et du pointeur

. Une référence a les avantages suivants par rapport à un pointeur :
  • Plus facile à utiliser :

    Une référence peut accéder directement au contenu de l'objet référencé sans déréférencement.

  • Syntaxe plus agréable et plus simple lors du passage des valeurs :

    Appel d'un bloc fonction qui passe une référence sans opérateur d'adresse au lieu d'un pointeur

    Exemple: fbDoIt(riInput:=iValue);

    À la place de: fbDoIt_1(piInput:=ADR(iValue));

  • Type de sécurité :

    Lors de l'affectation de deux références, le compilateur vérifie si leurs types de base correspondent. Ceci n'est pas vérifié dans le cas des pointeurs.

Tester la validité d'une référence

Vous pouvez utiliser l'opérateur __ISVALIDREF pour vérifier si une référence pointe vers une valeur valide (c'est-à-dire une valeur non égale à 0).

Syntaxe

<boolean variable name> := __ISVALIDREF( <reference name> );

<reference name>: Identifiant déclaré avec REFERENCE TO

La variable booléenne est TRUE lorsque la référence pointe vers une valeur valide. Sinon c'est FALSE.

PROGRAM PLC_PRG
VAR
    iAlfa : INT;
    riBravo : REFERENCE TO INT;
    riCharlie : REFERENCE TO INT;
    bIsRef_Bravo : BOOL := FALSE;
    bIsRef_Charlie : BOOL := FALSE;
END_VAR
iAlfa := iAlfa + 1;
riBravo REF= iAlfa;
riCharlie REF= 0;
bIsRef_Bravo := __ISVALIDREF(riBravo);  (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *)
bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)

Astuce

Dans la version 3.5.7.40 et supérieure du compilateur, la fonction de surveillance implicite CheckPointer agit sur des variables de type REFERENCE TO de la même manière que pour les variables pointeur.